// GLSA 顶点着色器
export const vertexShader = `
uniform float uTime;      // 0~1，整条飞线动画的推进进度
uniform float uFadeIn;    // 淡入时长（0~1 的相对比例）
uniform float uFadeOut;   // 淡出时长（0~1 的相对比例）
uniform float uHeadRatio; // 流星头部占整条曲线的比例（0~1）
uniform float uWidth;     // 基础粗细（管状几何体的最大半径）
uniform float uMaxWidth;     // uMaxWidth 为允许的最大粗细

varying float vFade;      // 顶点在“流星”内部的亮度：0=不可见 1=最亮
varying float vGlobal;    // 整条飞线的全局淡入淡出因子
varying float vHeadDist;  // 当前顶点距离流星头部的归一化距离（0=头部，1=尾部）

void main() {
  /* 1. 计算当前顶点在整个曲线上的归一化位置 */
  float arcPos = uv.x; // TubeGeometry 的 uv.x 恰好是 0~1
   /* 2. 推进波前沿 */
  float head = uTime;// 当前波头位置
  float tail = max(head - uHeadRatio, 0.0);
  /* 3. 流星推进包络（头部亮→尾部暗） */
  vFade = smoothstep(tail, head, arcPos) * (1.0 - smoothstep(head, head + 0.02, arcPos));
  // 4、顶点是否在波范围内
  float inWave = smoothstep(tail, head, arcPos) * (1.0 - smoothstep(head, head + 0.02, arcPos)); // 更锐利

  float dist01 = clamp((head - arcPos) / max(uHeadRatio, 0.001), 0.0, 1.0);
  // 5.指数衰减：头部 1，尾部 0，越靠近 0 越尖锐
  vFade = inWave * exp(-dist01 * 6.0);   // 6.0 可调，越大尾巴越短

  /* 6. 整条飞线全局淡入淡出包络 */
  float inAlpha  = smoothstep(0.0,uFadeIn,  uTime);
  float outAlpha = 1.0 - smoothstep(1.0 - uFadeOut, 1.0, uTime);
  vGlobal = inAlpha * outAlpha;

  /* 7. 最终挤出粗细 */
  float finalWidth = min(uWidth * vFade * vGlobal, uMaxWidth); // uMaxWidth 为允许的最大粗细
  vec3 offset = normal * finalWidth;

  vHeadDist = abs(head - arcPos) / max(uHeadRatio, 0.001); // 0 在头部，1 到尾部
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position + offset, 1.0);
}
`;
// 片元着色器 (fragmentShader)
export const fragmentShader = `
uniform float uTime;      // 0~1，整条飞线动画的推进进度
uniform vec3 uColor;      // 飞线基础颜色
varying float vFade;      // 来自顶点着色器的局部亮度
uniform float uGlowPower; // 辉光强度倍数
varying float vGlobal;    // 来自顶点着色器的全局透明度
varying float vHeadDist;  // 当前像素离头部的归一化距离
void main() {
 float alpha = vFade * vGlobal;
 if (uTime <= 0.0) discard;
 if (alpha < 0.01) discard; // 严格裁掉
 if (vFade < 0.01) discard; // 严格裁掉
    // 只在头部附近发光：距离头部越近越亮
    // 指数衰减，距离头部越近越亮
    float glow = exp(-vHeadDist * 8.0);   // 8.0 越大，光球越小
    vec3 c = mix(uColor, uColor * uGlowPower, glow);
    gl_FragColor = vec4(c, vFade * vGlobal);
}
`;
export const vertexCricleShader = `
// ===== 能量团‐顶点着色器 =====
uniform float uTime;          // 0 → 1 动画进度
uniform float uHeadRatio;     // 亮段长度比例（0~1）
uniform float uMaxRadius;     // 球体最大半径上限
uniform float uGradient;      // 曲线长度缩放因子（可选）
varying vec3 vViewPos;

// 自定义属性：当前顶点所在的球体在整条曲线中的归一化位置 0~1
attribute float t;

varying float vT;             // 传给片元，用于颜色/透明度
varying vec3  vNormal;

void main() {
    // 1. 推进波头
    float head   = uTime;
    float tail   = max(head - uHeadRatio, 0.0);

    // 2. 是否在亮段内
    float inWave = smoothstep(tail, head, t) * (1.0 - smoothstep(head, head + 0.02, t));

    // 3. 指数衰减半径：头部 1 → 尾部 0
    float scale = exp(-(head - t) * 8.0) * inWave;
    scale = clamp(scale, 0.0, 1.0);

    // 4. 限制最大半径
    float finalRadius = min(scale * uMaxRadius, uMaxRadius);

    // 5. 顶点缩放
    vec3 pos = position * finalRadius;
    vT = t;                 // 片元用
    vNormal = normalMatrix * normal;
    vec4 mvPos = modelViewMatrix * vec4(pos, 1.0);
    vViewPos   = mvPos.xyz;          // 传给片元
    gl_Position = projectionMatrix * mvPos;
}
`
export const fragmentCricleShader = `
precision mediump float;
uniform mediump float uTime;   // 与顶点阶段保持一致
uniform vec3  uColor;
uniform float uGlowPower;

varying float vT;
varying vec3  vNormal;
varying vec3  vViewPos;

void main() {
    float dist  = abs(uTime - vT);
    float alpha = exp(-dist * 6.0);
    alpha       = clamp(alpha, 0.0, 1.0);

    vec3 c = mix(uColor, uColor * uGlowPower, alpha);

    // 简易菲涅耳
    vec3 N  = normalize(vNormal);
    vec3 V  = normalize(-vViewPos);
    float f = pow(max(0.0, 1.0 - abs(dot(N, V))), 2.0);
    c += f * 0.4;

    gl_FragColor = vec4(c, alpha);
}
`